#include "ControladorVentanaEditEscenario.h"
#include "Circulo.h"
//ControladorVentanaEditEscenario::ControladorVentanaEditEscenario(){}

ControladorVentanaEditEscenario::ControladorVentanaEditEscenario(VentanaEditarEsc *ventEditEsc){
	this->ventana = ventEditEsc;

}

void ControladorVentanaEditEscenario::crearVentana(){
	this->ventana->graficar();
	
}

Ventana* ControladorVentanaEditEscenario:: getVentana(){
	return this->ventana;
}
void ControladorVentanaEditEscenario::controlarEventos(){
	
	Figura *figura,*figNueva;
	std::cout<<"Termino de graficar y ahora controla ra los eventos" << std::endl;
	std::list<Figura*>::iterator iter;
	bool encontro = false;
	bool terminar = false;
	SDL_Event evento;
	int x = 0, y = 0, i;
	//loop
	while(terminar == false) {
		SDL_Flip(this->getVentana()->getScreen());//encargado de que se repinte		
			while (SDL_PollEvent(&evento)) {
				//se presiona un boton del mouse
				if (evento.type == SDL_MOUSEBUTTONDOWN){
						SDL_GetMouseState(&x, &y); //almaceno las posiciones
						if(!encontro){
							//busqueda de la figura
							i=1;
							iter = this->getVentana()->iteratorListaFiguras();
							while(i<=this->getVentana()->sizeListaFiguras() && !encontro){  
								figura = *iter;
								if( figura->pertenecePixel(x,y)){
									if((x>800) && (y<600)){  // verifico q sea del pantalla derecha
										figNueva = this->clonarFigura(figura);
										this->getVentana()->addFigDinamicas(figNueva);
										figNueva->dibujar(this->getVentana()->getScreen());
										encontro = true;
									}
								}
								iter++;
								i++;
							}//while busca pixel
						}//if de busq de la fig
							
						else {//Drop y reseteo encontro
							encontro = !(this->soltarFigura(figNueva,x, y)); 
							}
						}
				}
				//se mueve el mouse
				if (evento.type == SDL_MOUSEMOTION){
					if (encontro){//va a actualizar la posicion de la fig que encontro
						SDL_GetMouseState(&x, &y);
						actualizarPosicionFigura(figNueva, x, y);
						refrescarPantallaArrastre();
					}
							
				}
				terminar = this->salirPantalla(evento);
		}
}


Figura *ControladorVentanaEditEscenario::clonarFigura(Figura *figura){
	Posicion *p = new Posicion (figura->getPosicion()->getX()-10, figura->getPosicion()->getY());
	
	//aca tiene que hacerse la copia de los atributos del elemento
	//
	Figura *figNueva = new Circulo(figura->getId(),20, p);
	figNueva->setColorFigura(new Color(230,230,0));
	return figNueva;
}

void ControladorVentanaEditEscenario::refrescarPantallaArrastre(){
	this->ventana->pintarPantalla();
	Figura *fig;
	std::list<Figura*>::iterator iterDin, iter;
	iterDin= this->getVentana()->iteratorListaFigDinamicas();
	iter = this->getVentana()->iteratorListaFiguras();
	
	int j= 1;
	while(j<=this->ventana->sizeListaFiguras()){
		fig = *iter;
		fig->dibujar(this->ventana->getScreen());
		iter++;
		j++;
	}	
	//Grafica las figuras en listadas
	j= 1;
	while(j<=this->ventana->sizeListaFigDinamicas()){
		fig = *iterDin;
		fig->dibujar(this->ventana->getScreen());
		iterDin++;
		j++;
	}	
	SDL_Flip(this->getVentana()->getScreen());

}

void ControladorVentanaEditEscenario::actualizarPosicionFigura(Figura *fig , int x, int y){
	fig->getPosicion()->setX(x);
	fig->getPosicion()->setY(y);
}

bool ControladorVentanaEditEscenario::estaDentroDelEscenario(int x, int y){
	if(x>30 && x<790 && y>30 && y<590) return true;
	else return false;
}

bool ControladorVentanaEditEscenario:: salirPantalla(SDL_Event evento){
	if(((evento.type == SDL_KEYDOWN)&&(evento.key.keysym.sym == SDLK_ESCAPE)) 
		||(evento.type == SDL_QUIT)){
				return true;
		}
	else return false;
}

void ControladorVentanaEditEscenario::controlarEventosMouse(SDL_Event evento){

}

bool ControladorVentanaEditEscenario::esEventoDelMouse(SDL_Event evento){
	if ((evento.type == SDL_MOUSEBUTTONDOWN) || (evento.type == SDL_MOUSEMOTION))
		return true;
	else return false;
}

bool ControladorVentanaEditEscenario::soltarFigura(Figura *figura, int x, int y){
	if(this->estaDentroDelEscenario(x,y)){
		this->actualizarPosicionFigura(figura, x, y);
		this->refrescarPantallaArrastre();
		return true; 
	}
	else return false;
}

ControladorVentanaEditEscenario::~ControladorVentanaEditEscenario(void){}
